/* STANDARD LIBRARY */
#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<math.h>
#include<ctime>

/* ADDITIONAL LIBRARY */
#include"constants.h" // constants

/* DECLATATIONS */
#ifndef DECLARATIONS_supToMain
#define DECLARATIONS_supToMain
/* Clock - MEASURE A TIME OF PROGRAM RINNING */
/*class Clock
{
private:
	time_t t_start;

public:
	Clock();
	void print();
};*/

/* Gutzwiller factor from Gutzwiller paper
 * my own calculation usinig Mathematica */
class Gutzwiller
{	
public:
	// for definitions of functions see supToMain.cpp file
	double value(double n, double m, double d, double sigma);
	double dn(double n, double m, double d, double sigma);
	double dm(double n, double m, double d, double sigma);
	double dd(double n, double m, double d, double sigma);
};

/* Dispersion relation*/
class Dispersion
{
private:
	const double t1; // hopping integral, the nearest neighbors
	const double t2; // hopping integ., second the nearest neighbors
public:
	Dispersion(const double _t1, const double _t2) : t1(_t1), t2(_t2) {}
	double value(double kx, double ky)
	{
		double cosx = cos(kx);
		double cosy = cos(ky);
		return -2.*t1*(cosx + cosy) + 4.*t2*cosx*cosy;
	}
};

/* Feermi Distribution */
class Distribution
{
public:
	double value(double x, double beta)
	{ return 0.5 * (1.0 - tanh( 0.5 * beta * x )); }
};
#endif
